문단 클릭 = 시작 위치 선택 · 재생은 우하단 버튼/P (재생 중 클릭 = 점프)

8장. 좋은 재료 모으기 (데이터셋 엔지니어링)

출처: 『AI 엔지니어링』(Chip Huyen 지음) | 원서: AI Engineering (O'Reilly) — 본 입문판은 PDF 원문에서 직접 풀어 썼다.

코드는 분위기만 — Python·함수 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.


0. 이 장의 새 단어 (0장에 없는 것만)

0장 용어집에 있는 말(파운데이션 모델·파인튜닝·토큰·환각 등)은 이미 안다고 치고 갑니다.

이 장에서 새로 나오는 어려운 말은 딱 3개입니다.


데이터 큐레이션(data curation)

한 문장 뜻 — 모델에게 먹일 데이터를 골라내고 다듬어서 학습에 딱 맞게 만드는 일.

일상비유 — 장보기 + 손질. 시장에서 좋은 재료만 고르고, 상한 건 버리고, 다듬어서 냄비에 넣을 준비를 하는 것.

한 줄 예 —

# 모은 데이터에서 나쁜 것만 골라 버림
good_data = [d for d in raw_data if 품질좋음(d)]

데이터 합성(data synthesis)

한 문장 뜻 — 진짜 데이터를 모으는 대신, 진짜처럼 보이는 데이터를 프로그램이나 AI로 새로 만들어 내는 일.

일상비유 — 모형 음식. 진짜 초밥을 못 구하면, 진짜처럼 보이는 가짜 초밥을 만들어 연습용으로 쓰는 것.

한 줄 예 —

# 진짜 데이터가 부족하면 AI로 비슷한 걸 만들어 냄
fake_data = ai.make("환자 기록처럼 보이는 가짜 기록 100개")

모델 증류(model distillation)

한 문장 뜻 — 크고 똑똑한 모델(선생)의 답을 베껴서, 작고 빠른 모델(학생)을 가르치는 일.

일상비유 — 족집게 과외 노트. 비싼 일타강사(큰 모델)가 푼 풀이를 받아 적어, 그 노트로 동생(작은 모델)을 가르치는 것.

한 줄 예 —

# 큰 모델이 만든 답으로 작은 모델을 학습시킴
answers = big_model.solve(questions)   # 선생이 풂
small_model.learn(questions, answers)  # 학생이 따라 배움

(귀납 도입) 이런 적 있죠?

요리 한번 망쳐 본 적 있죠?

레시피는 똑같이 따라 했는데, 재료가 시들시들했더니 맛이 영 별로였습니다.

모델도 똑같습니다.

저자는 이렇게 말합니다.

"무한한 컴퓨터를 가진 세계 최고 팀이라도, 데이터가 없으면 좋은 모델을 만들 수 없다."

옛날엔 "더 큰 모델, 더 좋은 구조"만 고민했습니다.

그런데 GPT-3 논문에선 데이터 담당이 단 2명이었습니다.

3년 뒤 그다음 세대 모델 논문에선 데이터 작업에 80명이 매달렸습니다.

# 옛날 사고 — 모델만 키우면 됨
make_model_bigger()  # 그러면 똑똑해지겠지

# 요즘 사고 — 재료(데이터)가 절반이다
prepare_great_data()  # 좋은 재료부터 모으자

데이터를 좋게 만들어 성능을 올리는 이 관점을 데이터 중심 AI라고 부릅니다.

반대로 모델 구조만 손대는 옛 방식이 모델 중심 AI입니다.

이 장은 "좋은 재료(데이터)를 어떻게 모으고 다듬느냐"가 전부입니다.


이 장에서 딱 5가지만

  1. 재료 고르기(큐레이션) — 좋은 데이터의 조건은 딱 3개: 품질·커버리지·양. (요리 비유로 외우면 됨)
  2. 재료가 부족하면 만들기(합성) — 진짜 데이터가 없으면 AI로 비슷한 걸 만들어 채운다.
  3. 선생 베끼기(증류) — 큰 모델의 답을 베껴 작은 모델을 싸게 가르친다.
  4. 가짜 재료의 함정 — AI가 만든 데이터만 계속 먹이면 모델이 망가진다(모델 붕괴). 진짜와 섞어야 한다.
  5. 재료 손질(처리) — 모으고 나면 직접 들여다보고, 중복 빼고, 형식을 맞춰야 한다.

지금은 이 다섯 개만 들고 가면 됩니다.


학습 목표

  • 좋은 데이터의 세 가지 조건(품질·커버리지·양)을 설명한다.
  • 데이터 합성과 데이터 증강을 구분한다.
  • 모델 증류가 무엇이고 왜 쓰는지 설명한다.
  • AI가 만든 데이터의 위험(모델 붕괴 등)을 설명한다.

개념 1 — 좋은 재료의 3가지 조건 (데이터 큐레이션)

망가지는 장면

"데이터 100만 개 모았는데 모델이 더 멍청해졌어요."

알고 보니 대충 긁어모은 데이터라 엉터리·중복·관계없는 게 잔뜩 섞여 있었습니다.

양만 많았지, 재료가 엉망이었던 겁니다.

비유 먼저 — 요리

모델 학습은 요리입니다.

데이터는 재료입니다.

좋은 요리의 조건이 곧 좋은 데이터의 조건입니다.

비유 (요리) 코드 위험
재료가 신선한가 (품질) data = [d for d in pool if 신선함(d)] 상한 재료(엉터리 데이터) 넣으면 음식 망함
재료가 골고루 있나 (커버리지) data = 한식 + 양식 + 중식 # 골고루 설탕만 잔뜩이면 단맛만 나는 모델
재료가 충분한가 (양) if len(data) < 필요량: 더모음() 너무 적으면 한 끼도 못 만듦

조건은 딱 세 개입니다.

품질, 커버리지, 양.

하나씩 보겠습니다.

조건 1 — 품질 (재료가 신선한가)

신선한 재료가 적은 게, 상한 재료가 많은 것보다 낫습니다.

저자가 든 실제 사례입니다.

신중하게 만든 1만 개의 지시가, 대충 모은 수십만 개보다 훨씬 나았다. (Yi 모델 팀) 잘 고른 1,000개 예시로도 거대한 최상급 모델에 맞먹는 답을 만들 수 있었다. (LIMA 연구)

좋은 데이터란 대략 이런 성질을 갖습니다.

관련성 있고, 일관되고, 형식이 깔끔하고, 중복이 없고, 규정을 지킬 것.

# before — 신선도 안 따지고 다 넣음
data = 인터넷에서_긁은_전부   # 상한 것도 같이 들어감

# after — 신선한 것만 골라 넣음
data = [d for d in 인터넷에서_긁은_전부 if 관련있고_깔끔함(d)]

미니 시나리오 — 제품 리뷰를 긁어 왔더니 HTML 태그(<div> 같은 것)가 잔뜩 붙어 있습니다.

이런 쓰레기 토큰은 학습을 방해하니, 떼어 내야 신선한 재료가 됩니다.

조건 2 — 커버리지 (재료가 골고루 있나)

사용자는 별별 방식으로 질문합니다.

긴 질문, 짧은 질문, 오타 섞인 질문, 여러 언어.

학습 데이터에 이 다양함이 골고루 들어 있어야 합니다.

이걸 데이터 다양성이라고도 부릅니다.

# before — 짧은 질문만 학습 → 긴 질문에 약함
data = [짧은질문1, 짧은질문2, ...]

# after — 길이·말투를 골고루
data = [짧은질문, 긴질문, 오타질문, 정중한질문, ...]

미니 시나리오 — 여러 나라 고객을 받는 챗봇이라면, 한 언어만 넣으면 안 됩니다.

언어와 문화를 골고루 담아야 모든 손님을 받을 수 있습니다.

조건 3 — 양 (재료가 충분한가)

"얼마나 필요하냐"는 "돈이 얼마나 필요하냐"와 같습니다.

상황마다 답이 다릅니다.

저자가 주는 실전 규칙이 있습니다.

큰 데이터셋에 투자하기 전에, 먼저 작게(50개) 시작해서 효과가 있는지 보라.

50개로도 좋아지는 신호가 보이면, 더 넣으면 더 좋아질 가능성이 큽니다.

50개로 아무 변화가 없으면, 데이터를 아무리 늘려도 헛수고일 수 있습니다.

# 작게 먼저 실험 — 효과 있나 보기
# 데이터[:50] — 전체 중 앞의 50개만 잘라 쓰는 표기 (전부 쏟아붓기 전에 맛보기)
모델1 = 파인튜닝(데이터[:50])    # 50개만
if 모델1이_좋아졌다:
    더_많은_데이터를_모은다()    # 신호가 좋으니 투자

미니 시나리오 — 데이터가 적을 땐 더 똑똑한 큰 모델에 살짝만 가르치는 게 낫고, 데이터가 아주 많을 땐 작은 모델을 통째로 가르치는 게 낫습니다.

한 걸음 더 ▸ (지금 몰라도 됨)

"데이터가 많으면 그냥 처음부터 모델을 만드는 게 낫지 않나?" 싶을 수 있습니다. 가끔은 맞습니다. 다만 미리 학습된 모델 위에 얹는 게 보통 더 효율적입니다. "경화(굳음)"라는 현상 때문에 가끔 손해일 수 있다는 정도만 알아 두면 됩니다. 지금은 "작게 실험부터"만 기억하세요.


개념 2 — 재료가 부족하면 만든다 (합성 vs 증강)

망가지는 장면

"의료 AI를 만들려는데, 진짜 환자 기록은 법 때문에 못 씁니다."

진짜 재료를 못 구하는 상황입니다.

이럴 때 "비슷한 걸 만들어 쓰는" 방법이 있습니다.

만드는 방식이 두 가지인데, 헷갈리기 쉽습니다.

비유 먼저 — 사진 한 장

고양이 사진 한 장이 있습니다.

  • 이 사진을 좌우로 뒤집으면, 여전히 같은 고양이의 "새 사진"이 됩니다 → 증강
  • 고양이를 본 적 없이 AI가 새 고양이를 그려 내면 → 합성
비유 코드 위험
사진을 뒤집기 (증강) new = flip(real_photo) 변형이라 원본과 너무 비슷할 수 있음
새로 그리기 (합성) new = ai.draw("고양이") 진짜가 아니라 품질이 들쭉날쭉

핵심 차이는 이것입니다.

  • 데이터 증강 — 진짜 데이터에서 출발해 변형한다. (뿌리가 진짜)
  • 데이터 합성 — 진짜를 흉내 내 처음부터 만든다. (뿌리가 가짜)

책에서는 둘을 묶어 그냥 "합성"이라 부를 때가 많습니다.

왜 만들까 — 합성의 이유

# 1) 양 늘리기 — 희귀한 상황 데이터 만들기
사고데이터 = ai.make("자율주행 사고 장면 1000개")  # 실제론 구하기 어려움

# 2) 프라이버시 — 진짜 환자 대신 가짜 환자
가짜환자 = ai.make("개인정보 없는 환자 기록")

# 3) 커버리지 — 일부러 짧은/긴/위험한 예시 채우기
유해표현 = ai.make("유해 탐지기 학습용 나쁜 말 예시")

미니 시나리오(worked) — 비밀번호 질문 하나를 AI에게 "바꿔 써 줘" 하면, 표현만 다른 질문 여러 개가 나옵니다.

"비번 어떻게 바꿔?" → "비밀번호를 잊어버렸어", "비밀번호 재설정 단계" …

이렇게 한 개로 여러 개를 만들어 커버리지를 넓힙니다.

미니 시나리오(부분 완성) — 빈칸을 채워 보세요.

원본 = "환불 어떻게 해요?"
# n=3 은 "바꿔 쓴 문장을 3개 만들어 달라"는 개수 지정
변형들 = ai.rephrase(원본, n=3)
# 변형들 → ["환불 받고 싶어요", "____", "____"]   # 표현만 다른 같은 뜻 질문

개념 3 — 선생을 베껴 작은 학생을 만든다 (모델 증류)

망가지는 장면

"제일 똑똑한 모델은 너무 크고 비싸서, 우리 서비스에 못 올립니다."

크고 똑똑하지만 느리고 비싼 모델이 있습니다.

이걸 작고 빠르게 줄이고 싶습니다.

비유 먼저 — 족집게 과외 노트

비싼 일타강사(큰 모델)에게 문제를 잔뜩 풀게 합니다.

그 풀이를 노트에 받아 적습니다.

그 노트로 동생(작은 모델)을 가르칩니다.

동생은 강사만큼은 아니어도, 그 노트 범위는 꽤 잘 풉니다.

비유 코드 위험
강사가 문제 풂 (선생 출력) ans = big_model.solve(q) 강사가 틀리면 노트도 틀림
노트로 동생 가르침 (학생 학습) small_model.learn(q, ans) 스타일만 흉내, 실력은 못 따라갈 수 있음

한 문장 정의 — 모델 증류는 큰 모델(교사)이 만든 답으로 작은 모델(학생)을 학습시켜, 비슷한 성능을 더 싸고 빠르게 내는 방법입니다.

실제 예 — BERT라는 모델을 증류한 DistilBERT는 크기를 40% 줄이고도 실력의 97%를 지켰고, 60% 더 빨라졌습니다.

또 알파카(Alpaca)는 큰 모델이 만든 5만 2천 개 예시로 작은 모델을 가르쳐, 4% 크기로 비슷하게 동작했습니다.

# before — 비싼 큰 모델을 그대로 서비스에 올림
answer = huge_expensive_model.ask(q)   # 느리고 비쌈

# after — 큰 모델로 학생을 가르친 뒤, 학생만 올림
notes = huge_expensive_model.solve(many_questions)  # 선생 풀이
small_model.learn(many_questions, notes)            # 학생이 배움
answer = small_model.ask(q)                          # 싸고 빠름

한 걸음 더 ▸ (지금 몰라도 됨)

아무 모델이나 베껴도 되는 건 아닙니다. 많은 모델은 "내 답을 베껴 다른 모델을 가르치지 마"라고 라이선스로 금지합니다. 지금은 "큰 모델 답으로 작은 모델을 싸게 만드는 게 증류"만 기억하면 됩니다.


개념 4 — 가짜 재료만 먹이면 망가진다 (AI 데이터의 한계)

망가지는 장면

"AI가 만든 데이터가 편하길래, 그것만 계속 먹였더니 모델이 점점 멍청해졌어요."

합성 데이터는 편리하지만, 함정이 있습니다.

비유 먼저 — 복사본의 복사본

복사기로 종이를 복사합니다.

그 복사본을 또 복사합니다.

또 복사합니다.

반복할수록 글자가 흐려지고, 결국 못 읽게 됩니다.

AI가 만든 데이터로만 계속 학습하면 똑같은 일이 벌어집니다.

이걸 모델 붕괴(model collapse)라고 부릅니다.

비유 코드 위험
복사본을 또 복사 (합성만 반복) data = ai.make(data) # 계속 반복 흐려져서 희귀한 것부터 잊음
진짜 원본을 섞음 (혼합) data = ai_data + real_data 비율을 잘못 잡으면 효과 줄어듦

왜 흐려질까요?

AI는 흔한 것은 잘 만들지만, 드문 것은 잘 안 만듭니다.

반복할수록 드문 것이 데이터에서 사라지고, 모델은 평범한 답만 내뱉게 됩니다.

저자가 정리한 가짜 재료의 한계 네 가지입니다.

# 1) 품질 — 쓰레기 넣으면 쓰레기 나옴
if not 검증가능(synthetic): 사용보류()

# 2) 피상적 모방 — 스타일만 베끼고 실력은 못 베낌
student.copy_style(teacher)   # 겉모습만 비슷, 어려운 건 못 풂

# 3) 모델 붕괴 — 합성만 반복하면 성능 추락
data = real_data + synthetic_data   # 반드시 진짜와 섞기

# 4) 불분명한 계보 — 어디서 온 데이터인지 모름
# 베낀 모델이 저작권 위반 데이터로 배웠다면, 내 모델도 위반일 수 있음

핵심 처방 — 합성 데이터는 진짜 데이터와 섞어 쓴다.

전부 합성이면 붕괴를 피할 수 없지만, 진짜와 섞으면 피할 수 있다는 연구가 있습니다.

미니 시나리오 — 의료 AI에서 가짜 환자 기록(합성)만 쓰면 위험합니다.

진짜 익명화 기록을 함께 섞고, 만든 데이터가 쓸 만한지 검증기로 채점한 뒤에 써야 합니다.


개념 5 — 모았으면 손질한다 (데이터 처리)

망가지는 장면

"데이터 다 모았으니 바로 학습 돌렸는데, 결과가 이상해요."

모은 재료를 바로 냄비에 넣은 셈입니다.

씻고, 다듬고, 똑같은 건 빼야 합니다.

비유 먼저 — 재료 손질

장 봐 온 재료를 바로 요리하지 않습니다.

씻고(정리), 똑같은 거 중복 빼고(중복 제거), 레시피 단위로 써는(형식 맞추기) 손질을 거칩니다.

비유 코드 위험
일단 눈으로 살펴봄 (검사) for d in data[:20]: print(d) 안 보면 숨은 문제를 놓침
똑같은 거 빼기 (중복 제거) data = list(set(data)) 중복은 모델에 편향을 심음
단위 맞춰 썰기 (형식 맞추기) d = strip_html(d).strip() 형식 틀리면 이상한 버그

손질의 핵심 단계입니다.

단계 1 — 직접 들여다보기 (검사)

저자가 가장 강조하는 한 줄입니다.

"데이터를 15분만 들여다봐도 보통 몇 시간의 삽질을 줄여 준다."

도구가 아무리 좋아도, 직접 눈으로 보는 걸 대신할 순 없습니다.

# 학습 전에 그냥 눈으로 몇 개 봄
# data[:20] 은 앞에서 20개만 잘라 본다는 뜻 — 다 볼 필요 없이 몇 개만 봐도 숨은 문제가 드러남
for example in data[:20]:
    print(example)   # 이상한 게 보이면 바로 잡음

단계 2 — 중복 빼기 (중복 제거)

같은 데이터가 여러 번 들어가면 모델이 편향됩니다.

저자의 예 — "빨간 연필 $20"이 세 번 들어가면, 모델은 "빨간 건 다 비싸다"고 잘못 배웁니다.

# before — 같은 예시가 여러 번
data = ["빨간연필", "빨간연필", "빨간연필", "초록나침반"]

# after — 한 번씩만
data = ["빨간연필", "초록나침반"]   # 편향 방지

단계 3 — 정리하고 형식 맞추기

쓸데없는 HTML 태그를 떼고, PII(개인정보) 같은 못 쓰는 정보를 지웁니다.

그리고 모델이 기대하는 형식으로 통일합니다.

실제 사례 — 데이터브릭스는 불필요한 HTML·마크다운을 떼자 정확도가 20% 오르고 입력 길이가 60% 줄었습니다.

# before — 태그·공백 뒤섞인 더러운 데이터
# \n 은 줄바꿈 기호 — 태그처럼 눈에 안 보이는 빈 줄·공백도 지워야 할 군더더기
raw = "  <div>좋은 제품!</div>\n\n "

# after — 깨끗하게 손질
clean = "좋은 제품!"   # 태그 제거 + 공백 정리

미니 시나리오(독립 적용) — 학습 데이터가 "버거 -->" 형식인데, 나중에 "버거"(화살표 빠짐)로 물으면 모델이 헷갈립니다.

학습 형식과 사용 형식을 똑같이 맞춰야 합니다.


단순 규칙 (이것만 기억하면 됨)

데이터 일은 복잡해 보여도, 규칙은 단순합니다.

  1. 재료부터 본다 — 양보다 신선도(품질). 적은 고품질이 많은 저품질을 이긴다.
  2. 골고루 담는다 — 사용자가 쓰는 다양한 방식(커버리지)을 빠짐없이.
  3. 작게 실험부터 — 50개로 효과를 보고 나서 더 모은다.
  4. 부족하면 만들되, 진짜와 섞는다 — 합성 데이터만 쓰면 망가진다(붕괴).
  5. 모았으면 직접 본다 — 눈으로 15분, 중복 빼고, 형식 맞추기.

기본 안전판은 "신선한 재료 + 직접 보기"입니다.


더 해보기 (검증된 자료, 검증 2026-09-05)

지금 몰라도 됩니다. 더 궁금할 때만 보세요.

  • 품질이 양을 이긴다는 근거LIMA 논문: 잘 고른 1,000개로 거대 모델에 맞먹은 실험.
  • 합성 데이터가 표준 전략이 된 흐름Synthetic Data Survey (2024).
  • 좋은 공개 데이터 모음HuggingFace datasets (사실상 표준 허브), FineWeb-Edu (교육 품질 필터링 웹 텍스트), Dolma (데이터 계보를 투명하게 공개한 코퍼스 — 흔히 인용되는 3조 개라는 크기는 2024년 판 기준이고 그 뒤로 훨씬 큰 판이 나왔으니, 크기를 인용할 때는 그 판의 공식 설명을 확인한다).

정리

  • 좋은 데이터의 조건은 셋: 품질·커버리지·양. 요리 재료로 외우면 쉽다.
  • 진짜 재료가 부족하면 만든다. 변형하면 증강, 새로 지으면 합성. 단, 합성만 쓰면 모델이 망가지니 진짜와 섞는다.
  • 모았으면 직접 들여다보고, 중복 빼고, 형식을 맞춘다. 이 손질이 절반이다.

다음 장 예고 1줄 — 좋은 데이터로 모델을 잘 만들었다면, 이제 그 모델을 빠르고 싸게 굴리는 법을 본다. (지금 몰라도 됩니다 — 다음 장에서 풀려요.)


연습문제

  1. 설명. 좋은 재료 모으기의 핵심을 처음 듣는 사람에게 한 문장으로 설명하라.
  2. 구분. 두 개념(합성 데이터, 증강 데이터)을 실제 예시 하나로 구분하라.
  3. 적용. 내 프로젝트나 학습 노트에서 이 장의 개념을 적용해 작게 개선할 지점을 하나 고르라.

부록 A. 쉬운 용어 사전

한글 용어 원문 영문명 아주 쉬운 뜻 이 장에서 나온 위치
합성 데이터 Synthetic Data 사람이 직접 모은 것이 아니라 모델이나 규칙으로 만든 데이터. 부록 B와 본문 예시
증강 데이터 - 기존 데이터를 조금 바꾸어 다양하게 늘린 데이터. 부록 B와 본문 예시
모델 증류 Model Distillation 큰 모델의 행동을 작은 모델이 따라 배우게 만드는 방법. 부록 B와 본문 예시
파인튜닝 Fine-tuning 이미 학습된 모델에 새 예시를 더 보여 주어 특정 행동을 더 잘하게 만드는 작업. 부록 B와 본문 예시
## 부록 B. 헷갈리는 개념 비교표
A B 구분 포인트
합성 데이터 증강 데이터 합성은 새 예시를 만들고, 증강은 기존 예시를 조금 바꿔 늘린다.
모델 증류 파인튜닝 증류는 큰 모델을 작은 모델이 따라 배우게 하고, 파인튜닝은 특정 작업 예시로 다듬는다.

부록 C. 연습문제 풀이

  1. 설명 예시. 좋은 재료 모으기는 거대 모델을 제품에 넣을 때 어떤 선택을 하고 어떻게 확인할지 판단하게 해 주는 장이다. 중요한 것은 용어를 외우는 것이 아니라, 이 개념이 어떤 입력·부품·결정에 영향을 주는지 말로 풀어 보는 것이다.
  2. 구분 예시. 두 개념(합성 데이터, 증강 데이터)의 차이는 이렇게 잡으면 된다. 합성은 새 예시를 만들고, 증강은 기존 예시를 조금 바꿔 늘린다. 실제 사례를 볼 때는 목적, 입력, 실패했을 때의 증상을 따로 적어 보면 헷갈리지 않는다.
  3. 적용 예시. 가장 작은 개선부터 고른다. 예를 들어 이름을 더 분명히 하거나, 평가 기준을 한 줄 추가하거나, 직접 알 필요 없는 내부 정보를 감추는 식으로 시작한다. 한 번에 크게 갈아엎는 것보다 작은 변경 하나를 확인하며 진행하는 쪽이 입문 단계에 맞다.
난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플   P 음성 버전 2026-08-05b